package com.huang.proxy;

/**
 * 代理模式
 */
public class ProxyPattern {

    public static void main(String[] args) {
        //通过代理对象类执行方法
        new RealSubjectProxy().haveRest();
//        new RealSubjectProxy().doWork();
    }

}

interface Subject{
    void doWork();
    void haveRest();
}

/**
 * 真实对象类
 */
class RealSubject implements Subject{

    @Override
    public void haveRest() {
        System.out.println("have a rest");
    }

    @Override
    public void doWork() {
        System.out.println("hello world");
    }


}

/**
 * 真实对象的代理类
 */
class RealSubjectProxy implements Subject{

    private Subject subject = new RealSubject();

    //第一种方法：将真实对象通过引入的方法带入进来
//    public RealSubjectProxy(RealSubject subject){
//        this.subject = subject;
//    }
    //第二种方法：通过反射获取真实对象
//    public RealSubjectProxy() {
//        try {
//            this.subject = (RealSubject)this.getClass().getClassLoader().
//                    loadClass("com.huang.proxy.RealSubject").newInstance();
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }

    public void connect(){
        System.out.println("建立连接");
    }

    public void log(){
        System.out.println("日志记录");
    }

    @Override
    public void doWork() {
        connect();
        subject.doWork();
        subject.haveRest();
        log();
    }

    @Override
    public void haveRest() {
        System.out.println("haha");
        subject.haveRest();
    }
}
